package org.zch.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;
import org.springframework.transaction.annotation.Transactional;
import org.zch.entity.dto.BottomDTO;
import org.zch.entity.dto.WorksDTO;
import org.zch.entity.dto.WorksUserDTO;
import org.zch.entity.po.UserWorksPO;
import org.zch.entity.po.WorksPO;
import org.zch.entity.vo.WorksByUserVO;
import org.zch.entity.vo.WorksVO;

import java.util.List;
import java.util.Map;

/**
 * 作品表(Works)表服务接口
 *
 * @author 刘新
 * @since 2024-01-03 14:09:06
 */
public interface WorksService extends IService<WorksPO> {

    /**
     * 插入方法
     *
     * @param worksPO 实体对象
     * @return 操作条数
     */
    @Transactional(rollbackFor = Exception.class)
    Integer insert(WorksPO worksPO);

    /**
     * 热门列表
     *
     * @param page 分页对象
     * @return 列表对象
     */
    List<WorksVO> hotList(WorksDTO page);

    /**
     * 最新列表
     *
     * @param page 查询条件
     * @return 列表对象
     */
    IPage<WorksVO> newList(WorksDTO page);

    /**
     * 发现列表
     *
     * @param page 查询条件
     * @return 列表对象
     */
    IPage<WorksVO> foundList(WorksDTO page);

    /**
     * 待审核列表
     *
     * @param page 查询条件
     * @return 列表对象
     */
    IPage<WorksPO> awaitList(Page<WorksPO> page);


    /**
     * 根据userCode获取用户作品数量
     *
     * @param userCode 用户编码
     * @return 作品数量
     */
    WorksByUserVO getWorksQuantityByUserCode(String userCode);

    /**
     * 根据code、状态获取用户作品
     *
     * @param page 查询对象
     * @return 返回结果
     */
    IPage<WorksVO> getWorksByUserCode(WorksUserDTO page);

    /**
     * 批量更新是否看过字段
     *
     * @param map ids:作品ids
     *            userCode:用户编码
     * @return 更新的条数
     */
    @Transactional(rollbackFor = Exception.class)
    Integer updateLooked(Map<String, Object> map);

    /**
     * 根据id，删除作品
     *
     * @param id 作品id
     * @return 操作的条数
     */
    @Transactional(rollbackFor = Exception.class)
    Integer deleteWork(Integer id);

    /**
     * 点赞作品
     *
     * @param worksPO 用户code、作品id
     * @return 操作的条数
     */
    @Transactional(rollbackFor = Exception.class)
    Integer likeWorks(WorksPO worksPO);


    /**
     * 更新或保存 关联表信息
     *
     * @param list 用户id、作品id
     * @return 操作的条数
     */
    @Transactional(rollbackFor = Exception.class)
    Integer saveOrUpdateUserWorks(List<UserWorksPO> list);


    /**
     * 取消点赞作品
     *
     * @param worksPO 用户code、作品id
     * @return 操作的条数
     */
    Integer noLikeWorks(WorksPO worksPO);

    /**
     * 点赞列表
     *
     * @param dto 查询条件
     * @return 分页对象
     */
    IPage<WorksVO> likeList(WorksDTO dto);

    /**
     * 播放作品的音频
     *
     * @param worksPO 用户code、作品id
     * @return 操作的条数
     */
    Integer playWorks(WorksPO worksPO);

    /**
     * 推荐垫底数据列表
     */
    IPage<WorksVO> recommendEmList(Page<WorksPO> page);


    /**
     * 获取垫底数据
     *
     * @param userCode 用户编码
     * @param dto      查询条件
     * @return
     */
    List<WorksVO> getBottom(String userCode, BottomDTO dto);

    /**
     * 获取用户所有作品的点赞数
     */
    Integer beenLikedNum(@Param("code") String code);

    /**
     * 被播放音频数量
     *
     * @param code 用户code
     * @return
     */
    Integer beenVoiceNum(@Param("code") String code);

    /**
     * 将已经看过的作品添加到过滤器中
     *
     * @param userCode 用户号
     * @param ids      作品ids
     * @return
     */
    Boolean addFilter(String userCode, List<Integer> ids);

    /**
     * 随机更新作品发布时间
     *
     * @return
     */
    void randomUpdateWorkTime();
}

